package com.itheima.health.config;

import com.itheima.health.service.UserService;
import com.itheima.health.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.ObjectPostProcessor;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;

@Configuration
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    UserServiceImpl userService;
    // 指定密码的加密方式

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
//        return new PasswordEncoder() {
//            @Override
//            public String encode(CharSequence charSequence) {
//                return charSequence.toString();
//            }
//
//            @Override
//            public boolean matches(CharSequence charSequence, String s) {
//                return Objects.equals(charSequence.toString(), s);
//            }
//        };
    }

    // 配置用户及其对应的角色
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }

    // 配置基于内存的 URL 访问权限
    //@Override
    //protected void configure(HttpSecurity http) throws Exception {
    //    http.authorizeRequests() // 开启 HttpSecurity 配置
    //            .antMatchers("/admin/**").hasRole("ADMIN") // admin/** 模式URL必须具备ADMIN角色
    //            .antMatchers("/user/**").access("hasAnyRole('ADMIN','USER')") // 该模式需要ADMIN或USER角色
    //            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") // 需ADMIN和DBA角色
    //            .anyRequest().authenticated() // 用户访问其它URL都必须认证后访问（登录后访问）
    //            .and().formLogin().loginProcessingUrl("/login").permitAll() // 开启表单登录并配置登录接口
    //            .and().csrf().disable(); // 关闭csrf
    //}
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //http.authorizeRequests()// 开启 HttpSecurity 配置
        ////调试,下方打开会组织所有请求
        //        . anyRequest().authenticated() // 用户访问其它URL都必须认证后访问（登录后访问）
        //        .and()
        // 关闭防CSRF攻击

        http.csrf().disable()
                // 设置登录相关配置
                .formLogin()
                .loginProcessingUrl("/sec/login") // 登录请求地址
                .failureForwardUrl("/user/loginFail") // 登录失败转地址
                .successForwardUrl("/user/loginSuccess") // 登录成功转发地址
                .loginPage("http://localhost:18080/pages/login.html") ;// 登录页地址
                // 设置登出相关配置
                //.and().logout()
                //.logoutUrl("/sec/logout") // 登出请求地址
                //.logoutSuccessUrl("http://localhost:18080/pages/login.html"); // 登出成功后跳转地址

    }
    //@Override
    //protected void configure(HttpSecurity http) throws Exception {
    //    http.authorizeRequests()// 开启 HttpSecurity 配置
    //    . anyRequest().authenticated() // 用户访问其它URL都必须认证后访问（登录后访问）
    //     //关闭防CSRF攻击
    //    .and()
    //    .csrf().disable()
    //            // 设置登录相关配置
    //            .formLogin()
    //            .loginProcessingUrl("/sec/login") // 登录请求地址
    //            .failureForwardUrl("/user/loginFail") // 登录失败转地址
    //            .successForwardUrl("/user/loginSuccess") // 登录成功转发地址
    //            .loginPage("http://localhost:18080/pages/login.html") ;// 登录页地址
    //
    //}
}